package com.jwb.demo002;

import com.jwb.demo002.bean.Config;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
import org.springframework.context.support.GenericApplicationContext;


public class Demo002Application {
    public static void main(String[] args) {
        GenericApplicationContext context = new GenericApplicationContext();
        context.registerBean("config", Config.class);// 手动添加Bean
        // -------添加beanFactory后处理器，用于解析不同的注解，对bean做定义---------
        /*
        ConfigurationClassPostProcessorl.class 是解析下列注解的后处理器
        @Component
        @PropertySources
        @ComponentScan、@ComponentScans注解的类
        @Import注解的类
        @ImportResource
        @Bean注解方法
         */
        context.registerBean(ConfigurationClassPostProcessor.class);
        context.registerBean(CommonAnnotationBeanPostProcessor.class); // @Resource @PostConstruct @PreDestroy
        context.registerBean(AutowiredAnnotationBeanPostProcessor.class);// 用于解析@Autowired @Value
        // 添加候选解析器，因为在Config类中，用到了字符串类型的注入，因为字符串类型在容器中并不是一个Bean，在注入的时候会报错。
        // 添加了这个候选解析器，配合使用@Value注解后，就不会报错。如果找不到对应的值，就会原样输出
        context.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
        context.refresh();// 执行beanFactory后处理器, 添加bean后处理器, 初始化所有单例
        System.out.println("-------遍历容器中的Bean-----");
        for (String name : context.getBeanDefinitionNames()) {
            System.out.println(context.getBean(name));
        }
        System.out.println("--------打印config中的成员------");
        Config config = context.getBean("config", Config.class);
        System.out.println(config);
    }
}


